/*!
 *  main.c - H8/300H Tinyサンプルプログラム
 *
 *  日付        内容
 *  ----------- ------------------------------------------------
 *  2009/08/23  新規作成
 */
#include "36064.h"
#include "serial.h"
#include "timerv.h"
#include "sw.h"
#include "treva.h"
#include "typedef.h"

//#include <stdlib.h>
#include <string.h> //strlen()
#include <stdio.h> // sprintf()
//#include <math.h>

void SCI_PrintHex(BYTE data)
{
    if (data <= 9) {
        data += 0x30;
        SciByteTx(data);
    } else {
        data += 0x37;
        SciByteTx(data);
    }
}

int main(void) {
    UINT magic;
    int j, k, x;
    BYTE data;

    init();
    init_sw();

    InitSci3(CBR_115200, non, 1);

    treva_init();

    //ループ
    while (1) {

        //画像取り込みスタート
        if (read_sw() == 1) {

#if 0
            //画像本体が取り込めるまで待つ
            treva_cap_start_wait();

            //ここから画像データの取り込み開始
            for ( k=0; k < 96*72*2; k++) {
                // 取得したデータを1バイトずつPCに転送
                data = treva_read_byte();
                SciStrTx("R\r\n", strlen("R\r\n"));
//                SciByteTx(treva_read_byte());
            }
#endif

            BYTE i;
            
            IO.PDR6.BIT.B4 = 0;//LED1 on
            IO.PDR6.BIT.B5 = 1;//LED2 off
            
            // 100bit連続して'1'が来るのを待つ
            i = 0;
            while (i<100) {
                if ( treva_read_bit() == 1) i++;
                else i = 0;
            }
            
            IO.PDR6.BIT.B4 = 1;//LED1 off
            IO.PDR6.BIT.B5 = 0;//LED2 on

#if 1
            /* '0xaa55'を待つ */
            magic = 0;
            while((magic & 0xffff) != 0xaa55){
              magic <<= 1;
              if(treva_read_bit())
                magic |= 0x1;
            }

            /* 続く30byte分のデータは無視 */
            SciStrTx("Header: ", strlen("Header: "));
            for( i=0; i<30; i++ ) {
                data = treva_read_byte();
                SCI_PrintHex((data >> 4) & 0x0f);
                SCI_PrintHex(data & 0x0f);
                SciByteTx(0x20);
            }
            SciStrTx("\r\n", strlen("\r\n"));
#else
            // 連続65bit分の'0'を検出
            i = 0;
            while (i<65) {
                if ( treva_read_bit() == 0) i++;
                else i = 0;
            }
            
            IO.PDR6.BIT.B4 = 0;//LED1 on
            IO.PDR6.BIT.B5 = 0;//LED2 on
            
            // 続く2byte分のデータは無視
            for ( i=0; i<2; i++ ) {
                data = treva_read_byte();
                if (data == 0x55) SciStrTx("0x55\r\n", strlen("0x55\r\n"));
                if (data == 0xaa) SciStrTx("0xaa\r\n", strlen("0xaa\r\n"));
            }
#endif
            IO.PDR6.BIT.B4 = 1;//LED1 off
            IO.PDR6.BIT.B5 = 1;//LED2 off

            for ( j=0; j < 96; j++) {
                IO.PDR6.BIT.B4 = 0;//LED1 on
                for ( k=0; k < 72; k++) {
                    for ( x=0; x < 2; x++) {
                        data = 0;
                        for (i=0; i<8; i++) {
                            data <<= 1;
                            if (treva_read_bit())
                                data |= 0x1;
                        }
                        SCI_PrintHex((data >> 4) & 0x0f);
                        SCI_PrintHex(data & 0x0f);
                        SciByteTx(0x20);
                    }
                }
                SciStrTx("\r\n", strlen("\r\n"));
                IO.PDR6.BIT.B4 = 1;//LED1 off
            }
        }

        wait(1);

    }

    return 0;
}
